#from numpy import *
import numpy as np

print('''
####五、数组元素访问

数组和矩阵元素的访问可通过下标进行，以下均以二维数组（或矩阵）为例：
''')

a = np.array([[3.2, 1.5], [2.5, 4]])
print(a[0][1])
print(a[0, 1])

print('''

可以通过下标访问来修改数组元素的值：

''')
b = a
a[0][1] = 2.0
print("a:")
print(a)
print("b:")
print(b)


print('''

现在问题来了，明明改的是a[0][1]，怎么连b[0][1]也跟着变了？
这个陷阱在Python编程中很容易碰上，其原因在于Python不是真正将a复制一份给b，而是将b指到了a对应数据的内存地址上。
想要真正的复制一份a给b，可以使用copy：
''')

a = np.array([[3.2, 1.5], [2.5, 4]])
b = a.copy()
a[0][1] = 2.0
print("a:")
print(a)
print("b:")
print(b)

print('''

若对a重新赋值，即将a指到其他地址上，b仍在原来的地址上：
''')
a = np.array([[3.2, 1.5], [2.5, 4]])
b = a
a = np.array([[2, 1], [9, 3]])
print("a:")
print(a)
print("b:")
print(b)

print('''

利用':'可以访问到某一维的全部数据，例如取矩阵中的指定列：
''')
a = np.arange(20).reshape(4, 5)
print("a:")
print(a)
print("the 2nd and 4 th column of a:")
print(a[:, [1, 3]])

print('''

稍微复杂一些，我们尝试取出满足某些条件的元素，这在数据的处理中十分常见，通常用在单行单列上。
下面这个例子是将第一列大于5的元素（10和15）对应的第三列元素（12和17）取出来：
''')
b = a[:, 2][a[:, 0] > 5]
print(b)

print('''

可使用where函数查找特定值在数组中的位置：
''')
loc = np.where(a==11)
print(loc)
print(a[loc[0][0], loc[1][0]])

print('''

####六、数组操作
还是拿矩阵（或二维数组）作为例子，首先来看矩阵转置：
''')
a = np.random.rand(2, 4)
print("a:")
print(a)
a = np.transpose(a)
print("a is an array, by using transpose(a):")
print(a)
b = np.random.rand(2, 4)
b = np.mat(b)
print("b:")
print(b)
print("b is a matrix, by using b.T:")
print(b.T)

print('''


矩阵求逆：
''')
a = np.random.rand(2, 2)
a = np.mat(a)
print("a:")
print(a)
ia = np.linalg.inv(a)
print("inverse of a:")
print(ia)
print("a * inv(a):")
print(a * ia)

print('''

求特征值和特征向量:
''')
a = np.random.rand(3, 3)
eig_value, eig_vector = np.linalg.eig(a)
print("eigen value:")
print(eig_value)
print("eigen vector:")
print(eig_vector)
